﻿using System;
using System.Collections;
using Castle.MonoRail.Framework;
using CoopSaude.DAO;
using CoopSaude.SCEMReference;

namespace CoopSaude.Controllers
{
    [ControllerDetails(Area = "Agendamento")]
    [DefaultAction("Criar")]
    public class AgendamentoController : BaseController
    {
        #region Actions
        public void Listar()
        {
            try
            {
                PropertyBag["listaProdutos"] = ScemDAO.listarProdutos(1, 1000, false);
            }
            catch (Exception e)
            {
                Flash["erro"] = "Ocorreu um erro ao acessar o serviço";
            }
            this.MenuUtilizado = "estoque";
            this.SecaoUtilizada = "produtos";
            this.AcaoUtilizada = "listar";
        }

        public void Adicionar()
        {
            PropertyBag["produto_codigo"] = Params["produto_codigo"];
            PropertyBag["produto_nome"] = Params["produto_nome"];
            PropertyBag["produto_descricao"] = Params["produto_descricao"];
            PropertyBag["produto_quantidade"] = Params["produto_quantidade"];
            PropertyBag["produto_quantidademinima"] = Params["produto_quantidademinima"];
            PropertyBag["listaFornecedores"] = ScemDAO.listarFornecedores(1, 1000, false);
            PropertyBag["listaTiposProduto"] = ScemDAO.listarTiposDeProduto();
            this.MenuUtilizado = "estoque";
            this.SecaoUtilizada = "produtos";
            this.AcaoUtilizada = "adicionar";
        }

        public void Criar()
        {
            this.MenuUtilizado = "estoque";
            this.SecaoUtilizada = "produtos";
            this.AcaoUtilizada = "adicionar";
            try
            {
                PropertyBag["listaTiposProduto"] = ScemDAO.listarTiposDeProduto();
                PropertyBag["listaFornecedores"] = ScemDAO.listarFornecedores(1, 1000, false);
                if (Params["produto_codigo"].ToString().Equals("") ||
                    Params["produto_nome"].ToString().Equals("") ||
                    Params["produto_descricao"].ToString().Equals("") ||
                    Params["produto_quantidade"].ToString().Equals("") ||
                    Params["produto_quantidademinima"].ToString().Equals("") ||
                    Params["produto_tipo"].ToString().Equals("")
                    )
                {

                    Flash["erro"] = "Voce precisa preencher todos os campos.";
                    RenderView("adicionar");
                }
                else {
                    ProdutoDTO produto = new ProdutoDTO();
                    produto.Codigo = Params["produto_codigo"].ToString().Trim();
                    produto.Nome = Params["produto_nome"].ToString().Trim();
                    produto.Descricao = Params["produto_descricao"].ToString().Trim();
                    produto.Quantidade = long.Parse(Params["produto_quantidade"].ToString());
                    produto.QuantidadeAlerta = long.Parse(Params["produto_quantidadeMinima"].ToString());
                    produto.Fabricante = "Fabricante 1";
                    produto.IdTipoProduto = Params["produto_tipo"];
                    produto = ScemDAO.adicionarProduto(produto);

                    if (Params["fornecedores_selecionados"] != null)
                    {
                        String[] fornecedoresSelecionados = Params["fornecedores_selecionados"].Split(',');
                        foreach (String fornecedor in fornecedoresSelecionados)
                        {
                            if (Params["preco-" + fornecedor] != "")
                            {
                                CondicaoVendaDTO condicaoDTO = new CondicaoVendaDTO();
                                condicaoDTO.FornecedorId = fornecedor;
                                condicaoDTO.ProdutoId = produto.Id;
                                condicaoDTO.PrazoEntregaHoras = 5;
                                condicaoDTO.Preco = Int32.Parse(Params["preco-" + fornecedor]);
                                condicaoDTO.QuantidadeMinimaVenda = 1;
                                condicaoDTO = ScemDAO.salvarCondicaoDeVenda(condicaoDTO);
                            }
                        }
                    }
                    Flash["sucesso"] = "Produto adicionado com sucesso";
                    RedirectToAction("listar");
                }
            }
            catch (Exception ex)
            {

                Flash["erro"] ="Ecorreu um erro ao salvar o produto durante a conexão com o banco de dados.";
                RenderView("adicionar");
            }
        }
        public void Editar()
        {
            try
            {

                PropertyBag["listaTiposProduto"] = ScemDAO.listarTiposDeProduto();
                PropertyBag["listaFornecedores"] = ScemDAO.listarFornecedores(1, 1000, false);
                ProdutoDTO produto = ScemDAO.obterProduto(Params["idProduto"]);
                PropertyBag["produto_codigo"] = produto.Codigo;
                PropertyBag["produto_nome"] = produto.Nome;
                PropertyBag["produto_descricao"] = produto.Descricao;
                PropertyBag["produto_quantidade"] = produto.Quantidade;
                PropertyBag["produto_quantidademinima"] = produto.QuantidadeAlerta;
                PropertyBag["produto_tipo"] = produto.IdTipoProduto;
                PropertyBag["produto_id"] = produto.Id;
                PropertyBag["listaTiposProduto"] = ScemDAO.listarTiposDeProduto();
                PropertyBag["listaCondicoes"] = ScemDAO.listarCondicaoDeVenda(produto.Id);
                
                this.MenuUtilizado = "estoque";
                this.SecaoUtilizada = "produtos";
                this.AcaoUtilizada = "editar";
            }
            catch (Exception ex)
            {

                Flash["erro"] = "Ecorreu um erro ao recuperar o produto";
                RedirectToAction("listar");
            }
        }

        public void Atualizar()
        {
            this.MenuUtilizado = "estoque";
            this.SecaoUtilizada = "produtos";
            this.AcaoUtilizada = "editar";
            try
            {

                PropertyBag["listaTiposProduto"] = ScemDAO.listarTiposDeProduto();
                PropertyBag["listaFornecedores"] = ScemDAO.listarFornecedores(1, 1000, false);
                PropertyBag["listaCondicoes"] = ScemDAO.listarCondicaoDeVenda(Params["produto_id"]);
                if (Params["produto_codigo"].ToString().Equals("") ||
                    Params["produto_nome"].ToString().Equals("") ||
                    Params["produto_descricao"].ToString().Equals("") ||
                    Params["produto_quantidade"].ToString().Equals("") ||
                    Params["produto_quantidademinima"].ToString().Equals("") ||
                    Params["produto_tipo"].ToString().Equals("")
                    )
                {

                    Flash["erro"] = "Voce precisa preencher todos os campos.";
                    RenderView("editar");
                }
                else
                {
                    ProdutoDTO produto = ScemDAO.obterProduto(Params["produto_id"]);
                    if (produto != null)
                    {
                        produto.Codigo = Params["produto_codigo"].ToString().Trim();
                        produto.Nome = Params["produto_nome"].ToString().Trim();
                        produto.Descricao = Params["produto_descricao"].ToString().Trim();
                        produto.Quantidade = long.Parse(Params["produto_quantidade"].ToString());
                        produto.QuantidadeAlerta = long.Parse(Params["produto_quantidadeMinima"].ToString());
                        produto.Fabricante = "Fabricante 1";
                        produto.IdTipoProduto = Params["produto_tipo"];
                        produto = ScemDAO.atualizarProduto(produto);

                        if (Params["fornecedores_excluidos"] != null)
                        {
                            String[] fornecedoresExcluidos = Params["fornecedores_excluidos"].Split(',');
                            foreach (String fornecedor in fornecedoresExcluidos)
                            {
                                ScemDAO.removerCondicao(produto.Id, fornecedor);
                            }
                        }

                        if (Params["fornecedores_selecionados"] != null)
                        {
                            
                            String[] fornecedoresSelecionados = Params["fornecedores_selecionados"].Split(',');

                            foreach (String fornecedor in fornecedoresSelecionados)
                            {
                                ScemDAO.removerCondicao(produto.Id, fornecedor);
                            }

                            foreach (String fornecedor in fornecedoresSelecionados)
                            {
                                if (Params["preco-" + fornecedor] != "")
                                {
                                    CondicaoVendaDTO condicaoDTO = new CondicaoVendaDTO();
                                    condicaoDTO.FornecedorId = fornecedor;
                                    condicaoDTO.ProdutoId = produto.Id;
                                    condicaoDTO.PrazoEntregaHoras = 5;
                                    condicaoDTO.Preco = Int32.Parse(Params["preco-" + fornecedor]);
                                    condicaoDTO.QuantidadeMinimaVenda = 1;
                                    condicaoDTO = ScemDAO.salvarCondicaoDeVenda(condicaoDTO);
                                }
                            }
                        }
                        Flash["sucesso"] = "Produto editado com sucesso";
                    } else {
                        Flash["sucesso"] = "Produto não encontrado";
                    }
                        RedirectToAction("listar");
                }
            }
            catch (Exception ex)
            {

                Flash["erro"] = "Ecorreu um erro ao salvar o produto durante a conexão com o banco de dados.";
                RenderView("editar");
            }
        }

        public void Detalhes()
        {
            try
            {
                ProdutoDTO produto = ScemDAO.obterProduto(Params["idProduto"]);
                PropertyBag["produto_codigo"] = produto.Codigo;
                PropertyBag["produto_nome"] = produto.Nome;
                PropertyBag["produto_descricao"] = produto.Descricao;
                PropertyBag["produto_quantidade"] = produto.Quantidade;
                PropertyBag["produto_quantidademinima"] = produto.QuantidadeAlerta;
                PropertyBag["produto_tipo"] = produto.IdTipoProduto;
                PropertyBag["produto_id"] = produto.Id;
                PropertyBag["listaTiposProduto"] = ScemDAO.listarTiposDeProduto();
                PropertyBag["listaCondicoes"] = ScemDAO.listarCondicaoDeVenda(produto.Id);
                PropertyBag["listaFornecedores"] = ScemDAO.listarFornecedores(1, 1000, false);
                this.MenuUtilizado = "estoque";
                this.SecaoUtilizada = "produtos";
                this.AcaoUtilizada = "detalhes";
            }
            catch (Exception ex)
            {

                Flash["erro"] = "Ecorreu um erro ao recuperar o produto";
                RedirectToAction("listar");
            }
        }

        public void Desativar()
        {
            try
            {
                ScemDAO.desativarProduto(Params["idProduto"].ToString());
                Flash["sucesso"] = "Produto desativado com sucesso.";
                RedirectToAction("listar");
            }
            catch (Exception ex)
            {

                Flash["error"] = "Ocorreu um erro ao excluir o produto durante a conexão com o banco de dados.";
                RedirectToAction("listar");
            }
        }

        public void Comprar()
        {
            this.MenuUtilizado = "estoque";
            this.SecaoUtilizada = "produtos";
            this.AcaoUtilizada = "comprar";
            try
            {
                ProdutoDTO produto = ScemDAO.obterProduto(Params["idProduto"]);
                PropertyBag["produto_codigo"] = produto.Codigo;
                PropertyBag["produto_nome"] = produto.Nome;
                PropertyBag["produto_descricao"] = produto.Descricao;
                PropertyBag["produto_quantidade"] = produto.Quantidade;
                PropertyBag["produto_quantidademinima"] = produto.QuantidadeAlerta;
                PropertyBag["produto_tipo"] = produto.IdTipoProduto;
                PropertyBag["produto_id"] = produto.Id;
                PropertyBag["listaTiposProduto"] = ScemDAO.listarTiposDeProduto();
                PropertyBag["listaCondicoes"] = ScemDAO.listarCondicaoDeVenda(produto.Id);
                PropertyBag["listaFornecedores"] = ScemDAO.listarFornecedores(1, 1000, false);
            }
            catch (Exception)
            {
                Flash["error"] = "Ocorreu um erro ao excluir o produto durante a conexão com o banco de dados.";
                RedirectToAction("listar");
            }
        }

        public void EfetuarCompra()
        {
            this.MenuUtilizado = "estoque";
            this.SecaoUtilizada = "produtos";
            this.AcaoUtilizada = "comprar";
            try
            {

                ProdutoDTO produto = ScemDAO.obterProduto(Params["produtoid"]);
                PropertyBag["produto_codigo"] = produto.Codigo;
                PropertyBag["produto_nome"] = produto.Nome;
                PropertyBag["produto_descricao"] = produto.Descricao;
                PropertyBag["produto_quantidade"] = produto.Quantidade;
                PropertyBag["produto_quantidademinima"] = produto.QuantidadeAlerta;
                PropertyBag["produto_tipo"] = produto.IdTipoProduto;
                PropertyBag["produto_id"] = produto.Id;
                PropertyBag["listaTiposProduto"] = ScemDAO.listarTiposDeProduto();
                PropertyBag["listaCondicoes"] = ScemDAO.listarCondicaoDeVenda(produto.Id);
                PropertyBag["listaFornecedores"] = ScemDAO.listarFornecedores(1, 1000, false);

                if (Params["produtoid"].ToString().Equals("") ||
                    Params["fornecedorid"].ToString().Equals("") ||
                    Params["quantidade-"+Params["fornecedorid"].ToString()].ToString().Equals("") 
                    )
                {

                    Flash["erro"] = "Voce precisa preencher o campo de quantidade.";
                    RenderView("comprar");
                }
                else
                {
                    OrdemCompraProdutoDTO ordem = new OrdemCompraProdutoDTO();
                    ordem.FornecedorId = Params["fornecedorid"].ToString();
                    ordem.ProdutoId = produto.Id;
                    ordem.Quantidade = Int32.Parse(Params["quantidade-"+Params["fornecedorid"].ToString()].ToString());
                    ordem.Observacao = "";
                    ordem = ScemDAO.criarOrdemCompra(ordem);

                    Flash["sucesso"] = "Compra inserida com sucesso";
                    RedirectToAction("listar");
                }
            }
            catch (Exception ex)
            {

                Flash["erro"] = "Ecorreu um erro ao salvar a compra durante a conexão com o banco de dados.";
                RedirectToAction("listar");
            }
        }
        #endregion Actions
    }
}
